#include "mainw.h"

#include "ui_mainw.h"

MainW::MainW(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainW)
{
    ui->setupUi(this);
    connect(ui->pushButtonConvert,SIGNAL(clicked()),this,SLOT(slot_convert()));
    connect(ui->actionOpen,SIGNAL(activated()),this,SLOT(slot_open()));
    connect(ui->actionSave,SIGNAL(activated()),this,SLOT(slot_save()));
}

MainW::~MainW()
{
    delete ui;
}

void MainW::slot_convert(){

    QString tmp_str=ui->textEditIn->toPlainText();

    int posEN=-1;
    int posEN2=0;
    int posen=0;
    int posRu=0;
    int posDig=0;
    QRegExp rxAZ("[A-Z]{2,8}");
    QRegExp rxEn("\n[A-Za-z]{2,}");
    QRegExp rxEn2(" [A-Z]{2,}\n[A-Za-z]{2,}");
    QRegExp rxaz("[a-z]{2,}");
    QRegExp rxRu(" [А-Яа-я]{2,}");
    QRegExp rxRuEn(" [А-Яа-я]{2,}\n[A-Za-z]{2,}");
    //QRegExp rxruru(" [а-я]{2,}\n[а-я]{2,}");
    QRegExp rxruru("[а-я]{2,}\n[а-я]{2,}");
    QRegExp rxDig("\n[2-9]");

/*
    //убрать переходы на новую строку без #, т.е. случаи когда перевод предыдущего англ слова закончен, а новое слово появляется сразу за переводом на новой строке(хотя должно было быть ограничено #)
while ((posRu=tmp_str.indexOf(rxRuEn, posen)) != -1)
{
posRu=tmp_str.indexOf(rxRuEn, posen);
posEN=tmp_str.indexOf(rxEn, posRu);
tmp_str.replace ( posEN, 1, "#" );
//qDebug()<<"first position="<<posRu;
posen=posEN;
}

//поиск случая когда после см. ABV переход на новую строку и там новое Англ слово
posen=0;
while ((posEN2=tmp_str.indexOf(rxEn2, posen)) != -1)
{
posEN2=tmp_str.indexOf(rxEn2, posen);
posEN=tmp_str.indexOf(rxEn, posEN2);
tmp_str.replace ( posEN, 1, "#" );
posen=posEN;
}*/

//поиск перехода на новую строку среди русского перевода или пояснения, исключая "см.". более того "см." обязательно ДОЛЖЕН переходить на новую
posen=0;
while ((posRu=tmp_str.indexOf(rxruru, posen)) != -1)
{
posRu=tmp_str.indexOf(rxruru, posen);
posEN=tmp_str.indexOf(QRegExp("\n[а-я]"), posRu);
int tmp_pos=tmp_str.indexOf(QRegExp("\nсм[.]"), posRu);
//qDebug()<<posEN<<"!="<<tmp_pos;
if(posEN!=tmp_pos)
tmp_str.replace ( posEN, 1, " " );
posen=posEN;
}


//установка перехода на новую строку для цифр TODO: это использовать при выводе в основной программе
/*
ui->statusBar-> showMessage("установка перехода на новую строку для цифр");
while ((posDig=tmp_str.indexOf(rxDig, posDig)) != -1)
{
     tmp_str.replace ( posDig, 1, "\n" );
     posDig+=2;//добавим пару символов и ищем дальше
 }
ui->statusBar-> showMessage("установка перехода на новую строку для цифр - Завершено");
*/
/*
//убрать переходы на новую строку для цифр
while ((posDig=tmp_str.indexOf(rxDig, posDig)) != -1)
{
     tmp_str.replace ( posDig, 1, " " );
     posDig+=2;//добавим пару символов и ищем дальше
 }

tmp_str.replace("#","\n\n");


posEN=0;
posen=0;
//posEN=tmp_str.indexOf(rxAZ, posen);
qDebug()<<"posEN="<<posEN;//<<" posen="<<posen;
while ((posEN=tmp_str.indexOf(rxAZ, posen)) != -1)//позиция на которой начинается Аббревиатура английская
{
    posen=tmp_str.indexOf(rxaz, posEN);//позиция расшифровки абревиатуры
        if(posen==-1)
            break;
    //установка переходов на новую строку после аббревиатур
        tmp_str.replace ( posen-1, 1, "\n" );
 }

*/

    /*
tmp_str.replace("\n\n\n","\n\n");
tmp_str.replace("\n","\t");
tmp_str.replace("#","\n");
*/

//новый вариант, для внесения в бд


int state=0;
int schet=0;
int count=0;
QStringList values;
values=tmp_str.split("\n\n");
QStringList::iterator it_values;
it_values=values.begin();
while(it_values!=values.end()){
    //qDebug()<<(*it_values);
    QStringList tmp_words;
    tmp_words=(*it_values).split("\n");
    QStringList::iterator it_tmp_words;
it_tmp_words=tmp_words.begin();
    while(it_tmp_words!=tmp_words.end()){
        if(tmp_words.size()==schet+2)//если есть только слово и перевод, то проверять не надо
            break;

        //qDebug()<<(*it_tmp_words)<<" "<<count;
        if((((*it_tmp_words).indexOf(rxAZ, 0)>=0)&&((*it_tmp_words).indexOf(rxAZ, 0)<2))&&( !(state&SqliteDB::ABBR))){
          state+=SqliteDB::ABBR;
          schet+=1;
          ++it_tmp_words;
          ++it_tmp_words;
           count++;
            count++;
          //++it_tmp_words;//если аббревиатур нет, то две следующие записи это слово и его перевод, смысла их проверять нет, а ошибки могут быть
          continue;
      }


        if(((*it_tmp_words).indexOf(QRegExp("[А-Я]"), 0)>=0)&&((*it_tmp_words).indexOf(QRegExp("[А-Я]"), 0)<2)&&(!(state&SqliteDB::EXCEP))){
            if(((count>2)&&(state&SqliteDB::ABBR))||((count>1)&&(!(state&SqliteDB::ABBR)))){
          state+=SqliteDB::EXCEP;
          schet+=1;
      }
          ++it_tmp_words;
           count++;
          continue;
      }
        if(((*it_tmp_words).indexOf(QRegExp("см."), 0)>=0)&&(!(state&SqliteDB::FREQ))){
          state+=SqliteDB::FREQ;
          QString tmp=(*it_tmp_words);
          tmp.replace("см. ", "");//убираем см. чтобы в дальнейшем не мешалось, при выводе надо будет его добавлять
         *it_tmp_words=tmp;
          schet+=1;
//         qDebug()<<tmp;
//         ++it_tmp_words;
//          continue;
         break; //продолжать смысла нет, так как см. должна быть последней
      }
        if(*it_tmp_words==""){
            tmp_words.erase(it_tmp_words);
        break;
        }
        ++it_tmp_words;
        count++;
    }
    schet=0;
    count=0;
    state+=SqliteDB::WORD;
    state+=SqliteDB::TRANSL;
db.setString(tmp_words,state);


//qDebug()<<"------------------------"<<state<<"---------------------------------";
    state=0;
++it_values;
}


ui->textEditOut->clear();
ui->textEditIn->clear();
ui->textEditOut->insertPlainText(tmp_str);

}

void MainW::slot_open(){
 QString   Filename =
 QFileDialog::getOpenFileName( this,
 QString("Открыть файл"));
 if (!Filename.isEmpty()) // если имя файла задан
{
  // Создаем файл
  QFile MyFile(Filename);
 MyFile.open(QIODevice::ReadOnly);
  QTextStream input(&MyFile);
ui->textEditIn->insertPlainText(input.readAll ());
}

 ui->statusBar-> showMessage("Открыт файл "+Filename);
}

void MainW::slot_save(){
     QString   Filename =
 QFileDialog::getSaveFileName( this,
 QString("Сохранить файл"));
 if (!Filename.isEmpty()) // если имя файла задано
{
  // Создаем файл
  QFile MyFile(Filename);
 MyFile.open(QIODevice::WriteOnly);
  QTextStream output(&MyFile);
output<<ui->textEditOut->toPlainText();
MyFile.close();
}
 ui->statusBar-> showMessage("Сохранено в файл "+Filename);
}
